package com.javabasic.algorithm.leetcode;

import java.lang.reflect.Array;
import java.util.Arrays;

/**
 * @Author xiongmin
 * @Description //TODO
 * @Date 2020/2/8 22:03
 * @Version 1.0
 **/
public class PlusOne {
    public int[] plusOne(int[] digits) {
        int len = digits.length;
        int[] arr = new int[len+1];
        int temp = 1, k = len-1, val;
        while (k >= 0) {
            val = temp + digits[k];
            arr[len] = val%10;
            temp = val/10;
            k--;
            len--;
        }
        if (temp > 0) {
            arr[len] = temp;
            return arr;
        } else {
            len = digits.length;
            for (int i = 0; i < len; i++) {
                digits[i] = arr[i+1];
            }
            return digits;
        }
    }


    /**
     * 解法二：
     * 1. 反转原数组 --> 得到数组B
     * 2. 数组B加一，计算结果，最高为如果有进位(进位的值一定为1)保存到一个变量A中
     * 3. 反转B数组 --> 得到原数组加一之后的结果（去除最高位的进位）
     * 4.1. 如果A>0 生成新的数组C; C[0] = A; C[j] = 原数组[i] (j=i+1) 返回数组C
     * 4.2. 如果A<=0 直接返回原数组
     * @param digits
     * @return
     */
    public int[] plusOne2(int[] digits) {
        int len = digits.length;
        int halfLen = len/2;
        int temp;
        for (int i = 0; i < halfLen; i++) {
            temp = digits[i];
            digits[i] = digits[len-1-i];
            digits[len-1-i] = temp;
        }
        int preValue = 1;
        for (int i = 0; i < len; i++) {
            temp = preValue + digits[i];
            digits[i] = temp%10;
            preValue = temp/10;
        }
        for (int i = 0; i < halfLen; i++) {
            temp = digits[i];
            digits[i] = digits[len-1-i];
            digits[len-1-i] = temp;
        }
        for (int i = 0; i < len; i++) {
            System.out.print(digits + " ");
        }
        System.out.println();
        if (preValue > 0) {
            int[] result = new int[len+1];
            temp = 0;
            result[temp++] = preValue;
            for (int i = 0; i < len; i++) {
                result[temp++] = digits[i];
            }
            return result;
        } else {
            return digits;
        }
    }
}
